package com.zzyl.service.impl;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.zzyl.enums.BasicEnum;
import com.zzyl.exception.BaseException;
import com.zzyl.service.WeChatService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.print.attribute.standard.JobSheets;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description WeChatServiceImpl
 * @Author luohai
 * @Date 2024-10-20
 */
@Service
public class WeChatServiceImpl implements WeChatService {
    //登录请求路径
    private static final String REQUEST_URL="https://api.weixin.qq.com/sns/jscode2session";
    //获取token的请求路径
    private static final String TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token";
    //获取手机号的请求路径
    private static final String PHONE_REQUEST_URL="https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
    //微信小程序账号和密钥，从配置文件中读取
    @Value("${zzyl.wechat.appId}")
    private String appId;
    @Value("${zzyl.wechat.appSecret}")
    private String secret;


    @Override
    public String getOpenId(String code) {
        //将需要的请求参数封装到Map中
        Map<String,Object> param= new HashMap<>();
        param.put("appid",appId);
        param.put("secret",secret);
        param.put("js_code",code);
        param.put("grant_type","authorization_code");
        //远程调用微信小程序的请求，返回响应体对象
        String json = HttpUtil.get(REQUEST_URL, param);
        //解析响应体对象
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //判断请求是否成功
        if (jsonObject.get("errcode")!=null){
            //不成功抛出异常
            throw new BaseException(BasicEnum.GET_OPENID_ERROR);
        }
        //拿到响应体里的openid参数
        String openId = jsonObject.get("openid").toString();
        //将openid参数返回
        return openId;
    }

    @Override
    public String getPhoneNumber(String phoneCode) {
        //调用getAccessToken方法拿到accessToken的值，同时也是请求参数需要的值
        String accessToken = getAccessToken();
        //将需要的请求参数封装到Map中
        Map<String,Object> param=new HashMap<>();
        param.put("code",phoneCode);
        //远程调用微信小程序的请求，返回响应体对象，由于PHONE_REQUEST_URL参数中token的值没有拼接完全，需要拼接值
        String json = HttpUtil.post(PHONE_REQUEST_URL + accessToken, JSONUtil.toJsonStr(param));
        //解析响应体对象
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //判断请求是否成功
        if (jsonObject.get("errcode")!=null && !jsonObject.getInt("errcode").equals(0)){
            //不成功抛出异常
            throw new BaseException(BasicEnum.GET_PHONE_ERROR);
        }
        //拿到响应体里的phoneNumber的值并转成字符串格式返回
        return jsonObject.getJSONObject("phone_info").getStr("phoneNumber");
    }

    public String getAccessToken(){
        //将需要的请求参数封装到Map中
        Map<String,Object> param= new HashMap<>();
        param.put("appid",appId);
        param.put("secret",secret);
        param.put("grant_type","client_credential");
        //远程调用微信小程序的请求，返回响应体对象
        String json = HttpUtil.get(TOKEN_URL, param);
        //解析响应体对象
        JSONObject jsonObject = JSONUtil.parseObj(json);
        //判断请求是否成功
        if (jsonObject.get("errcode")!=null){
            //不成功抛出异常
            throw new BaseException(BasicEnum.GET_TOKEN_ERROR);
        }
        //拿到响应体里的access_token的值并转成字符串格式返回
        return jsonObject.get("access_token").toString();
    }
}
